#!/usr/local/bin/lua

a = {}
k = "x"
 
a[k] = 10       -- 键为"x", 值为10
a[20] = "great" -- 键为20, 值为"great"
print(a["x"])   -- 获取键"x"的值
print(a[k])     -- 同上
print(a[20])    -- 获取键20的值
k = 20   
print(a[k])     -- 获取键20的值
a["x"] = a["x"] + 1 --将键"x"的值加1
print(a["x"])

-- 可以有多个表名引用于同一个表,当最后一个引用释放时,垃圾收集器会最终删除这个表
b = a
b["x"] = 100
print(a["x"])
b = nil
print(a["x"])
a = nil

-- 当把表当做结构体使用时,可以把表名当做结构体名,然后使用"."调用表的元素
a = {}
a.name = "xiaoming"
a.age = 18
print(a["name"])
print(a.name)
print(a["age"])
print(a.age)

a = {}
 
a[2] = 666
print(a[2])
print(a[2.0])
a[2.0] = 777
print(a[2])
print(a[2.0])
a = nil

polyline = {
    color = "blue", thickness = 2, npoints = 4,
    {x = 0, y = 0},  -- polyline[1]
    {x = 10, y = 0}, -- polyline[2]
    666,             -- polyline[3]
    value = 5, 
    "HelloWorld"     -- polyline[4]
}
 
 
print(polyline["color"]) -- blue
print(polyline["value"]) -- 5
 
print(polyline[1].x) -- 0
print(polyline[2].x) -- 10
print(polyline[3])   -- 666
print(polyline[4])   -- HelloWorld

-- 错误的, +和-不符合索引命名规则
-- opnames = { + = "add", - = "sub" }
 
-- 错误的,索引虽然正确,但是不需要使用双引号
-- opnames = { "a" = "add", "b" = "sub" }

-- 正确的,使用方括号指明索引
opnames = { ["+"] = "add", ["-"] = "sub"}
 
print(opnames["+"])
s = '-'
print(opnames[s])
-- 可以使用数字作为索引, 并且索引值还可以为负的
i = 1
a = {[-1] = "A", [0] = "A".."A", [i] = "A".."A".."A"}
 
print(a[-1])
print(a[0])
print(a[1])

-- {x = 0, y = 0}   -- 等价于{["x"] = 0, ["y"] = 0}
-- {"r", "g", "b"}  -- 等价于{[1] = "r", [2] = "g", [3] = "b"}

-- 不是序列
t = {10, print, x = 12, k = "hi"}
for k, v in pairs(t) do
    print(k, v)
end
 
-- 是个序列, 因为所有元素的索引都有顺序
t = {10, print, 12, "hi"}
for k, v in pairs(t) do
    print(k, v)
end


-- table.insert()
-- 该函数的一种形式为:向序列的指定位置插入一个元素,其他元素依次后移
-- table.remove()
-- 该函数的一种形式为:该函数删除并返回序列指定位置的元素,然后将后面的元素向前移动填充
-- 该函数的另一种形式为:删除时不指定位置,那么会把末尾的元素进行删除

-- 利用table.insert()和table.remove()实现堆、队列、双端队列
-- 借助这两个函数,可以很容易地实现栈、队列和双端队列
-- 以栈为例:
t = {}
x = 1
table.insert(t,x)
table.remove(t)

-- table.move()
-- Lua 5.3引入了这个函数
-- 该函数的一种用法为:table.move(a, f, e, t)。调用该函数可以将表a中从索引f到e的元素(包括f和e本身)拷贝到位置t上

t1 = {"A","B","C","D","E","F"}
table.move(t1,2,3,1)
for k,v in pairs(t1) do
    print(k,v)
end

-- 该函数的另一种用法为:table.move(a, f, e, t, b)。意思为:把表a从索引f到e的元素(包括f和e本身)移动到表b位置t上,函数返回表b的位置
a = {1, 2}
b = {3, 4}
 
table.move(a, 1, #a, #b + 1, b)
for k,v in pairs(b) do
    print(k,v)
end